package com.example.oss.controller;

import com.aliyun.oss.OSS;
import com.aliyun.oss.model.OSSObject;
import com.aliyun.oss.model.OSSObjectSummary;
import com.aliyun.oss.model.ObjectListing;
import com.example.oss.service.OssService;
import com.example.oss.utils.R;
import jakarta.annotation.Resource;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Map;

@RestController
@RequestMapping("/oss")
public class OssController {

	@Resource
	private OSS ossClient;

	@Resource
	private OssService ossService;

	@Value("${alibaba.cloud.oss.bucket-name}")
	private String bucketName;



	/*
	* 生成对象存储 OSS 签名
	*/
	@GetMapping(value = "/policy")
	public R<Object> generateProxy() {
		Map<String,String> policy = ossService.generatePolicy();
		return R.ok(policy);
	}

	/*
	 * 创建存储空间 Bucket
	 */
	@GetMapping("/createBucket")
	public void createBucket() {
		ossClient.createBucket(bucketName);
	}

	/*
	* 文件上传
	*/
	@GetMapping("/upload")
	public String upload() {
		try {
			// 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
			String objectName = "classpath:/oss-test.json";
			File file = new File(objectName);

			// 上传本地文件到OSS，第一个参数为bucket名称，第二个参数为文件名称，第三个参数为 File 文件或者 InputStream 输入流
			ossClient.putObject(bucketName, "oss-test.json", file);
		} catch (Exception e) {
			return "upload fail: " + e.getMessage();
		}
		return "upload success";
	}

	/*
	 * 从 OSS 下载文件
	 */
	@GetMapping("/download")
	public String download() {
		try {
			// 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
			String objectName = "exampledir/exampleobject.txt";

			// 调用ossClient.getObject返回一个OSSObject实例，该实例包含文件内容及文件元数据。
			OSSObject ossObject = ossClient.getObject(bucketName, objectName);
			// 调用ossObject.getObjectContent获取文件输入流，可读取此输入流获取其内容。
			InputStream content = ossObject.getObjectContent();
			if (content != null) {
				BufferedReader reader = new BufferedReader(new InputStreamReader(content));
				while (true) {
					String line = reader.readLine();
					if (line == null) {
						break;
					}
					System.out.println("\n" + line);
				}
				// 数据读取完成后，获取的流必须关闭，否则会造成连接泄漏，导致请求无连接可用，程序无法正常工作。
				content.close();
			}
			return "download success";
		} catch (Exception e) {
			return "download fail: " + e.getMessage();
		}
	}

	/*
	* 列举文件, 列举指定目录下的文件详情
	*/
	@GetMapping("/list")
	public void list() {
		// ossClient.listObjects返回ObjectListing实例，包含此次listObject请求的返回结果。
		ObjectListing objectListing = ossClient.listObjects(bucketName);
		// objectListing.getObjectSummaries获取所有文件的描述信息。
		for (OSSObjectSummary objectSummary : objectListing.getObjectSummaries()) {
			System.out.println(" - " + objectSummary.getKey() + "  " +
					"(size = " + objectSummary.getSize() + ")");
		}
	}

	@DeleteMapping("/delete")
	public void delete() {
		// 填写Object完整路径，例如exampledir/exampleobject.txt。Object完整路径中不能包含Bucket名称。
		String objectName = "exampledir/exampleobject.txt";
		ossClient.deleteObject(bucketName, objectName);
	}

}

// 参考阿里云 OSS 官方示例 https://help.aliyun.com/zh/oss/getting-started/sdk-quick-start?spm=a2c4g.11186623.0.0.3de87368vLK8Ob